968. 监控二叉树
968. 监控二叉树
Similar Question
Solution Tips
方案一: 贪心
叶子节点的状态没处理好, 由子节点的状态, 决定父节点的状态, 并且状态有 3 种, 感觉也有其他类似的题目
返回 true or false 的类型还是常见的, 这题进阶了一下
var minCameraCover = function(root) {
let result = 0
function traversal(cur) {
if(cur === null) {
return 2
}
let left = traversal(cur.left)
let right = traversal(cur.right)
if(left === 2 && right === 2) {
return 0
}
if(left === 0 || right === 0) {
result++
return 1
}
if(left === 1 || right === 1) {
return 2
}
return -1
}
if(traversal(root) === 0) {
result++
}
return result
};
错误的 case
var minCameraCover = function(root) {
// 只要有2个子节点, 就一定要自己监视? 从低往上
// 只要有有2个子节点, 而且不是两个都有x, 就需要自己监视
// 所以是一个子树问题, 分支思想
if (root === null) return 0;
if (root.left === root.right) return 1;
let res = 0;
dfs(root);
return res;
function dfs(node) {
// 叶子节点不需要装摄像头, 所以返回 true
// 返回自己是否被监视了, 装了摄像头为 2
if (node === null) return 1;
const left = dfs(node.left);
const right = dfs(node.right);
// 有一个儿子没有被监视自己就需要装
// 两个儿子都被监视了, 自己就不需要装
// 自己没装摄像头, 但是被儿子的摄像头覆盖了为 0
const check = left + right
// 1 + 1 自己不需要, 两个儿子已经监控好自己了
// 0 + 1 自己不需要, 但要去监控另一个儿子
// 0 + 0 自己需要, 可监控两个儿子
if (check < 2) {
res++;
return 1;
}
else {
return 0;
}
}
};
console.log(minCameraCover(t.root))